/**
  ******************************************************************************
  * @file    xxx.c 
  * @author  SD Electronics xxx
  * @version V1.0
  * @date    xx-xx-xx
  * @brief   xxxxxxxxxxxxxxxxxx.
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "sd_common.h"


/** 
  * @brief  USART
  */ 
ST_USART_CNT_PHY st_uart_cnt_phy = {
    USART_INDEX_1, 
    115200, 
    8, 
    0, 
    1,
    EN_UART_TRANSMODE_ATCMD,
}; 

/** 
  * @brief  USART
  */ 
ST_USART_CTRL g_stUsartCtrl = 
{                       
    false,
    &st_uart_cnt_phy,
};  
/**
  * @}
  */



/**
  * @brief  SDGetUart_TPMODE
  * @param  None
  * @note	xxx
  * @retval None
  */
uint8_t SDGetUart_TPMODE(void)
{
    return st_uart_cnt_phy.AT_TransferMode;
}

/** 
  * 函数功能： Read_ADC_Data_10K
  * 参数说明：
  * 返回说明：
  * 调用范围：
  * 完成时间：
  * 修改时间：
  * 修改原因：
  */
void SDInitUart(PST_USART_CNT_PHY pstUsartCntPhy)
{
    #if 0//FR5086
    PST_USART_PHY_PARAM pstUsartPhyParam = GetUSARTxPhyParamFun(pstUsartCntPhy->ucUsartIndex);	
    system_set_port_pull_up(pstUsartPhyParam->usUSARRXPin, true);
    system_set_port_mux(pstUsartPhyParam->pstUSARTxGPIOPort, pstUsartPhyParam->usUSARRXPin, pstUsartPhyParam->ucRxIORole);
    system_set_port_mux(pstUsartPhyParam->pstUSARTxGPIOPort, pstUsartPhyParam->usUSARTXPin, pstUsartPhyParam->ucTxIORole);
    uart_init(pstUsartCntPhy->ulBaudRate);

    //static uint8_t app_at_recv_char;
    //static uint8_t app_at_uart_recv[32];
    //uart0_read_for_hci(&app_at_recv_char, 1, app_at_uart_recv, NULL);

    NVIC_EnableIRQ((IRQn_Type)pstUsartPhyParam->IRQn);
    #else//FR801xh
    system_set_port_pull(GPIO_PD4, true);
    system_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PORTD4_FUNC_UART0_RXD);
    system_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PORTD5_FUNC_UART0_TXD);
    
    uart_param_t param =
    {
        .baud_rate = 115200,
        .data_bit_num = 8,
        .pari = 0,
        .stop_bit = 1,
    };
    uart_init1(UART0, param);
    NVIC_EnableIRQ(UART0_IRQn);

    #endif 
    printf("usr: sd uart init.\r\n");
}

/** 
  * 函数功能： Read_ADC_Data_10K
  * 参数说明：
  * 返回说明：
  * 调用范围：
  * 完成时间：
  * 修改时间：
  * 修改原因：
  */
static long UartOpen(void *pvHandle, unsigned long ulOption)
{
    PST_DEV_MANAGE pstDevManage = pvHandle;

    long lRet = EN_DEV_CTL_RET_CODE_FAILED;
    if (0 != pstDevManage)
    {
        PST_USART_CTRL pstUsartCtrl = (PST_USART_CTRL)pstDevManage->pvData;
        if(false == pstUsartCtrl->bInitFlag)
        {
			/* Usart */
            SDInitUart(pstUsartCtrl->pstUsartInfo);
            pstUsartCtrl->bInitFlag = true;
        }
        lRet = EN_DEV_CTL_RET_CODE_SUCCESSED;
    }
    return lRet;
}  

/** 
  * 函数功能： Read_ADC_Data_10K
  * 参数说明：
  * 返回说明：
  * 调用范围：
  * 完成时间：
  * 修改时间：
  * 修改原因：
  */
static long UartRead(void *pvHandle, unsigned long ulOpertion, unsigned char *pucDataBuf, int* ulDataSize)
{
    PST_DEV_MANAGE pstDevManage = pvHandle;
    long lRet = EN_DEV_CTL_RET_CODE_FAILED;
    if (0 != pstDevManage)
    {
        PST_USART_CTRL pstUsartCtrl = (PST_USART_CTRL)pstDevManage->pvData;
        /*  */
        if(true == pstUsartCtrl->bInitFlag)
        {
            uint8_t ucBaudRate[6] = {0};
            switch(pstUsartCtrl->pstUsartInfo->ulBaudRate)
            {
                case BAUD_RATE_1200:memcpy(ucBaudRate, "1200", strlen("1200"));break;
                case BAUD_RATE_2400:memcpy(ucBaudRate, "2400", strlen("2400"));break;
                case BAUD_RATE_4800:memcpy(ucBaudRate, "4800", strlen("4800"));break;
                case BAUD_RATE_9600:memcpy(ucBaudRate, "9600", strlen("9600"));break;
                case BAUD_RATE_14400:memcpy(ucBaudRate, "1440", strlen("1440"));break;
                case BAUD_RATE_19200:memcpy(ucBaudRate, "19200", strlen("19200"));break;
                case BAUD_RATE_38400:memcpy(ucBaudRate, "38400", strlen("38400"));break;
                case BAUD_RATE_57600:memcpy(ucBaudRate, "57600", strlen("57600"));break;
                case BAUD_RATE_115200:memcpy(ucBaudRate, "115200", strlen("115200"));break;
                case BAUD_RATE_230400:memcpy(ucBaudRate, "230400", strlen("230400"));break;
                case BAUD_RATE_460800:memcpy(ucBaudRate, "460800", strlen("460800"));break;
                case BAUD_RATE_921600:memcpy(ucBaudRate, "921600", strlen("921600"));break;
                default:break;
            }
            *ulDataSize = strlen((char*)ucBaudRate);
            memcpy(pucDataBuf, ucBaudRate, strlen((char*)ucBaudRate));
        }
        lRet = EN_DEV_CTL_RET_CODE_SUCCESSED;
    }
    return lRet;    
}

/** 
  * 函数功能： Read_ADC_Data_10K
  * 参数说明：
  * 返回说明：
  * 调用范围：
  * 完成时间：
  * 修改时间：
  * 修改原因：
  */
static long UartWrite(void *pvHandle, unsigned long ulOpertion, unsigned char *pucDataBuf, unsigned long ulDataLen)
{
    PST_DEV_MANAGE pstDevManage = pvHandle;
    long lRet = EN_DEV_CTL_RET_CODE_FAILED;
    if (0 != pstDevManage)
    {
        PST_USART_CTRL pstUsartCtrl = (PST_USART_CTRL)pstDevManage->pvData;
		int ucBaudRate =  MyAtoi((char *)pucDataBuf);
        /* */
        if(true == pstUsartCtrl->bInitFlag)
        {
            switch(ulOpertion)
            {
                case CMD_BAUD:
                    
                    lRet = EN_DEV_CTL_RET_CODE_SUCCESSED;
                    switch(ucBaudRate)
                    {
                        case 1200:ucBaudRate = BAUD_RATE_1200;break;
                        case 2400:ucBaudRate = BAUD_RATE_2400;break;
                        case 4800:ucBaudRate = BAUD_RATE_4800;break;
                        case 9600:ucBaudRate = BAUD_RATE_9600;break;
                        case 14400:ucBaudRate = BAUD_RATE_14400;break;
                        case 19200:ucBaudRate = BAUD_RATE_19200;break;
                        case 38400:ucBaudRate = BAUD_RATE_38400;break;
                        case 57600:ucBaudRate = BAUD_RATE_57600;break;
                        case 115200:ucBaudRate = BAUD_RATE_115200;break;
                        case 230400:ucBaudRate = BAUD_RATE_230400;break;
                        case 460800:ucBaudRate = BAUD_RATE_460800;break;
                        case 921600:ucBaudRate = BAUD_RATE_921600;break;
                        default: lRet = EN_DEV_CTL_RET_CODE_FAILED;break;                         
                    }
                break;

                //
                case CMD_TPMODE:
                printf("usr: cmd tpmode.\r\n");
                pstUsartCtrl->pstUsartInfo->AT_TransferMode = ulOpertion;
                break;
                default:break;
            }
            
            if(EN_DEV_CTL_RET_CODE_SUCCESSED == lRet)
                pstUsartCtrl->pstUsartInfo->ulBaudRate = ucBaudRate;
        }
        
    }
    return lRet;
}
/** 
  * 函数功能： UartControl
  * 参数说明：
  * 返回说明：
  * 调用范围：
  * 完成时间：
  * 修改时间：
  * 修改原因：
  */
static long UartControl (void *pvHandle,unsigned long ulOpertion, unsigned long ulControlCmd, void *pvd)
{
    PST_DEV_MANAGE pstDevManage = pvHandle;
    long lRet = EN_DEV_CTL_RET_CODE_FAILED;
    if (0 != pstDevManage)
    {
        lRet = EN_DEV_CTL_RET_CODE_SUCCESSED;
        uint8_t *uart_data = (uint8_t *)pvd;
        uint32_t uart_data_len = ulControlCmd;
        uart_write(UART0, uart_data, uart_data_len);
    }
    return lRet;             
}

/** 
  * 函数功能： Read_ADC_Data_10K
  * 参数说明：
  * 返回说明：
  * 调用范围：
  * 完成时间：
  * 修改时间：
  * 修改原因：
  */
static long UartClose (void *pvHandle)
{
    PST_DEV_MANAGE pstDevManage = pvHandle;
    long lRet = EN_DEV_CTL_RET_CODE_FAILED;
    if (0 != pstDevManage)
    {
        PST_USART_CTRL pstUsartCtrl = (PST_USART_CTRL)pstDevManage->pvData;
        if(0 != pstUsartCtrl)
        {
            pstUsartCtrl->bInitFlag = false;
        }
        lRet = EN_DEV_CTL_RET_CODE_SUCCESSED;
    }
    return lRet;    
}



/** 
  * 函数功能： Read_ADC_Data_10K
  * 参数说明：
  * 返回说明：
  * 调用范围：
  * 完成时间：
  * 修改时间：
  * 修改原因：
  */
ST_CTR_FUN g_stUartCtlFUN = 
{
    UartOpen,		/* */
    UartRead,		/* */
    UartWrite,		/**/
    UartControl,	/* undefine */
    UartClose    	/**/
};


/******************* (C) COPYRIGHT 2011 ShenZhenShiding electronics **************************/
